home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / hplip / levels.py < prev    next >
Text File  |  2008-10-13  |  10KB  |  311 lines

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # (c) Copyright 2003-2007 Hewlett-Packard Development Company, L.P.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19. #
  20. # Author: Don Welch
  21. #
  22.  
  23. __version__ = '1.3'
  24. __title__ = 'Supply Levels Utility'
  25. __doc__ = "Display bar graphs of current supply levels for supported HPLIP printers."
  26.  
  27. # Std Lib
  28. import sys
  29. import getopt
  30. import time
  31. import operator
  32. import os
  33.  
  34. # Local
  35. from base.g import *
  36. from base import device, status, utils, tui
  37. from prnt import cups
  38.  
  39. DEFAULT_BAR_GRAPH_SIZE = 8*(tui.ttysize()[1])/10
  40.  
  41.  
  42. USAGE = [(__doc__, "", "name", True),
  43.          ("Usage: hp-levels [PRINTER|DEVICE-URI] [OPTIONS]", "", "summary", True),
  44.          utils.USAGE_ARGS,
  45.          utils.USAGE_DEVICE,
  46.          utils.USAGE_PRINTER,
  47.          utils.USAGE_SPACE,
  48.          utils.USAGE_OPTIONS,
  49.          utils.USAGE_BUS1, utils.USAGE_BUS2,
  50.         ("Bar graph size:", "-s<size> or --size=<size> (current default=%d)" % DEFAULT_BAR_GRAPH_SIZE, "option", False),
  51.         ("Use colored bar graphs:", "-c or --color (default is colorized)", "option", False),
  52.         ("Bar graph character:", "-a<char> or --char=<char> (default is '/')", "option", False),
  53.          utils.USAGE_LOGGING1, utils.USAGE_LOGGING2, utils.USAGE_LOGGING3,
  54.          utils.USAGE_HELP,
  55.          utils.USAGE_SPACE,
  56.          utils.USAGE_NOTES,
  57.          utils.USAGE_STD_NOTES1, utils.USAGE_STD_NOTES2, 
  58.          ]
  59.  
  60. def usage(typ='text'):
  61.     if typ == 'text':
  62.         utils.log_title(__title__, __version__)
  63.  
  64.     utils.format_text(USAGE, typ, __title__, 'hp-levels', __version__)
  65.     sys.exit(0)
  66.  
  67.  
  68. def logBarGraph(agent_level, agent_type, size=DEFAULT_BAR_GRAPH_SIZE, use_colors=True, bar_char='/'):
  69.     #print agent_level, agent_type, size, use_colors, bar_char
  70.     
  71.     adj = 100.0/size
  72.     if adj==0.0: adj=100.0
  73.     bar = int(agent_level/adj)
  74.     if bar > (size-2): bar = size-2
  75.  
  76.     if use_colors:
  77.         if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM, AGENT_TYPE_CYAN, AGENT_TYPE_CYAN_LOW):
  78.             log.info(log.codes['teal'])
  79.         elif agent_type in (AGENT_TYPE_MAGENTA, AGENT_TYPE_MAGENTA_LOW):
  80.             log.info(log.codes['fuscia'])
  81.         elif agent_type in (AGENT_TYPE_YELLOW, AGENT_TYPE_YELLOW_LOW):
  82.             log.info(log.codes['yellow'])
  83.         elif agent_type == AGENT_TYPE_BLUE:
  84.             log.info(log.codes['blue'])
  85.         elif agent_type == AGENT_TYPE_BLACK:
  86.             log.info(log.codes['bold'])
  87.         elif agent_type in (AGENT_TYPE_LG, AGENT_TYPE_G, AGENT_TYPE_PG):
  88.             pass
  89.  
  90.     color = ''
  91.     if use_colors:
  92.         if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM):
  93.             color = log.codes['fuscia']
  94.  
  95.     log.info(("-"*size)+color)
  96.  
  97.     color = ''
  98.     if use_colors:
  99.         if agent_type in (AGENT_TYPE_CMY, AGENT_TYPE_KCM):
  100.             color = log.codes['yellow']
  101.  
  102.     log.info("%s%s%s%s (approx. %d%%)%s" % ("|", bar_char*bar, 
  103.              " "*(size-bar-2), "|", agent_level, color))
  104.  
  105.     color = ''
  106.     if use_colors:
  107.         color = log.codes['reset']
  108.  
  109.     log.info(("-"*size)+color)
  110.  
  111.  
  112.  
  113.  
  114. log.set_module('hp-levels')
  115.  
  116. try:
  117.     try:
  118.         opts, args = getopt.getopt(sys.argv[1:], 'p:d:hl:b:s:ca:g',
  119.             ['printer=', 'device=', 'help', 'help-rest', 'help-man', 
  120.              'help-desc', 'logging=', 'size=', 'color', 'char=', 'bus='])
  121.  
  122.     except getopt.GetoptError, e:
  123.         log.error(e.msg)
  124.         usage()
  125.  
  126.     printer_name = None
  127.     device_uri = None
  128.     log_level = logger.DEFAULT_LOG_LEVEL
  129.     bus = device.DEFAULT_PROBE_BUS
  130.     size = DEFAULT_BAR_GRAPH_SIZE
  131.     color = True
  132.     bar_char = '/'
  133.  
  134.     if os.getenv("HPLIP_DEBUG"):
  135.         log.set_level('debug')
  136.  
  137.     for o, a in opts:
  138.         if o in ('-h', '--help'):
  139.             usage()
  140.  
  141.         elif o == '--help-rest':
  142.             usage('rest')
  143.  
  144.         elif o == '--help-man':
  145.             usage('man')
  146.  
  147.         elif o == '--help-desc':
  148.             print __doc__,
  149.             sys.exit(0)
  150.  
  151.         elif o in ('-p', '--printer'):
  152.             if a.startswith('*'):
  153.                 printer_name = cups.getDefaultPrinter()
  154.                 log.debug(printer_name)
  155.                 
  156.                 if printer_name is not None:
  157.                     log.info("Using CUPS default printer: %s" % printer_name)
  158.                 else:
  159.                     log.error("CUPS default printer is not set.")
  160.                 
  161.             else:
  162.                 printer_name = a
  163.  
  164.         elif o in ('-d', '--device'):
  165.             device_uri = a
  166.  
  167.         elif o in ('-b', '--bus'):
  168.             bus = [x.lower().strip() for x in a.split(',')]
  169.             if not device.validateBusList(bus):
  170.                 usage()
  171.  
  172.         elif o in ('-l', '--logging'):
  173.             log_level = a.lower().strip()
  174.             if not log.set_level(log_level):
  175.                 usage()
  176.  
  177.         elif o in ('-s', '--size'):
  178.             try:
  179.                 size = int(a.strip())
  180.             except TypeError:
  181.                 size = DEFAULT_BAR_GRAPH_SIZE
  182.  
  183.             if size < 1 or size > DEFAULT_BAR_GRAPH_SIZE:
  184.                 size = DEFAULT_BAR_GRAPH_SIZE
  185.  
  186.         elif o in ('-c', '--color'):
  187.             color = True
  188.  
  189.         elif o in ('-a', '--char'):
  190.             try:
  191.                 bar_char = a[0]
  192.             except KeyError:
  193.                 bar_char = '/'
  194.  
  195.         elif o == '-g':
  196.             log.set_level('debug')
  197.  
  198.  
  199.     if device_uri and printer_name:
  200.         log.error("You may not specify both a printer (-p) and a device (-d).")
  201.         usage()
  202.  
  203.     utils.log_title(__title__, __version__)
  204.     
  205.     if os.getuid() == 0:
  206.         log.warn("hp-levels should not be run as root.")
  207.  
  208.     if not device_uri and not printer_name:
  209.         try:
  210.             device_uri = device.getInteractiveDeviceURI(bus, filter={'status-type': (operator.gt, 0)})
  211.             if device_uri is None:
  212.                 sys.exit(1)
  213.         except Error:
  214.             log.error("Error occured during interactive mode. Exiting.")
  215.             sys.exit(1)
  216.  
  217.  
  218.     try:
  219.         d = device.Device(device_uri, printer_name)
  220.     except Error:
  221.         log.error("Error opening device. Exiting.")
  222.         sys.exit(1)
  223.  
  224.     if d.device_uri is None and printer_name:
  225.         log.error("Printer '%s' not found." % printer_name)
  226.         sys.exit(1)
  227.  
  228.     if d.device_uri is None and device_uri:
  229.         log.error("Malformed/invalid device-uri: %s" % device_uri)
  230.         sys.exit(1)
  231.  
  232.     user_cfg.last_used.device_uri = d.device_uri
  233.  
  234.     try:
  235.         try:
  236.             d.open()
  237.             d.queryDevice()
  238.         except Error, e:
  239.             log.error("Error opening device (%s). Exiting." % e.msg)
  240.             sys.exit(1)
  241.  
  242.         if d.mq['status-type'] != STATUS_TYPE_NONE:
  243.  
  244.             #print d.dq
  245.             
  246.             log.info("")
  247.  
  248.             sorted_supplies = []
  249.             a = 1
  250.             while True:
  251.                 try:
  252.                     agent_type = int(d.dq['agent%d-type' % a])
  253.                     agent_kind = int(d.dq['agent%d-kind' % a])
  254.                 except KeyError:
  255.                     break
  256.                 else:
  257.                     sorted_supplies.append((a, agent_kind, agent_type))
  258.  
  259.                 a += 1
  260.  
  261.             sorted_supplies.sort(lambda x, y: cmp(x[2], y[2]) or cmp(x[1], y[1]))
  262.  
  263.             #print sorted_supplies
  264.             
  265.             for x in sorted_supplies:
  266.                 a, agent_kind, agent_type = x
  267.                 agent_health = d.dq['agent%d-health' % a]
  268.                 agent_level = d.dq['agent%d-level' % a]
  269.                 agent_sku = str(d.dq['agent%d-sku' % a])
  270.                 agent_desc = d.dq['agent%d-desc' % a]
  271.                 agent_health_desc = d.dq['agent%d-health-desc' % a]
  272.  
  273.                 #print agent_health
  274.                 
  275.                 if agent_health in (AGENT_HEALTH_OK, AGENT_HEALTH_UNKNOWN) and \
  276.                     agent_kind in (AGENT_KIND_SUPPLY,
  277.                                     AGENT_KIND_HEAD_AND_SUPPLY,
  278.                                     AGENT_KIND_TONER_CARTRIDGE,
  279.                                     AGENT_KIND_MAINT_KIT,
  280.                                     AGENT_KIND_ADF_KIT,
  281.                                     AGENT_KIND_INT_BATTERY,
  282.                                     AGENT_KIND_DRUM_KIT,):
  283.  
  284.                     log.info(log.bold(agent_desc))
  285.                     log.info("Part No.: %s" % agent_sku)
  286.                     log.info("Health: %s" % agent_health_desc)
  287.                     logBarGraph(agent_level, agent_type, size, color, bar_char)
  288.                     log.info("")
  289.  
  290.                 else:
  291.                     log.info(log.bold(agent_desc))
  292.                     log.info("Part No.: %s" % agent_sku)
  293.                     log.info("Health: %s" % agent_health_desc)
  294.                     log.info("")
  295.  
  296.  
  297.         else:
  298.             log.error("Status not supported for selected device.")
  299.             sys.exit(1)
  300.     finally:
  301.         d.close()
  302.         
  303. except KeyboardInterrupt:
  304.     log.error("User exit")
  305.     
  306. log.info("")
  307. log.info("Done.")
  308.  
  309.  
  310.  
  311.